<?php
require_once(LIBDIR . '/lib_db1.php'); //lib encargada conexion con d1
require_once(LIBDIR . '/lib_db2.php'); //lib encargada conexion con db

//banco de funciones para las nuevas funcionalidaddes...
//################################################################################
//FUNCIONES GENERALES

//funcion para mostrar mensajes al team, se usa para subir sc
function msgbox_team($caption, $message,$grade)
{
	if( $grade == '1')
		$class = "sol_correct";
	elseif( $grade == '0' )
		$class = "sol_incorrect";

	return '<fieldset><legend>'.$caption.'</legend><span class="sol '.$class.'">'.
		$message.'</span></fieldset>';
}
//funcion para obtener las filas de una consulta 
//UTIL CUANDO SE ESPERAN VARIAS FILAS DE UNA CONSULTA
function result_query($res)
{
	$resultados = array();
	$tam_res = mysql_num_rows($res);
	for($i=0; $i<$tam_res; $i++){
		$datos = mysql_fetch_array($res, MYSQL_BOTH);
		$resultados[$i] = $datos;
	}
	return $resultados;
}	

//** FUNCIONES PARA SERIALIZAR ARRAYS   **//
function array_envia($array) { 
     $tmp = serialize($array); 
     $tmp = urlencode($tmp); 
     return $tmp; 
}

function array_recibe($url_array) { 
     $tmp = stripslashes($url_array); 
     $tmp = urldecode($tmp); 
     $tmp = unserialize($tmp); 

    return $tmp; 
}
//funcion para sumar minutos a us date 
function add_date($givendate,$minus) 
{
	$cd = strtotime($givendate);
	$newdate = date('Y-m-d H:i:s', mktime(date('H',$cd),
    			date('i',$cd)+$minus, date('s',$cd), date('m',$cd),
    			date('d',$cd), date('Y',$cd)));
	return $newdate;
}
//funcion para conocer el nombre de un problema o de un team a partir del id
//se diferencia de exist en que retorna un solo elemento
function get_name($id ,$table, $conexion)
{
	if( $table == "problem" )
		$key = "probid";
	elseif($table == "team")
		$key = "login";
	
	$query = "SELECT `name` FROM `".$table."` WHERE `".$key."`='$id' ";
	$res = mysql_query($query ,$conexion);	
	if($res)
	{
		$nombre = mysql_fetch_array($res, MYSQL_BOTH);
		return $nombre;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
			mysql_error($conexion) . ", query: '$query'");
	}
}
//################################################################################
//FUNCIONES USADAS PARA DB2
//CONSULTAS PARA LA NUEVA DB; from JURY to CONSTEST 
global $db;
$db = "domjudge2";
//$db = db2();

//función que retorna el nombre de un team especifico, recibe el login del mismo
function get_teamname($login, $conexion)
{
	$query= "SELECT `name` FROM `team` WHERE `login`='$login'";
	$res = mysql_query($query ,$conexion);
	if($res)
	{
		$teamname = mysql_fetch_array($res, MYSQL_BOTH);
		return $teamname;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
			mysql_error($conexion) . ", query: '$query'");
	}
}
//funcion para obtener datos de un contest especifico 
function get_cont($cid, $conexion)
{
	$query= "SELECT * FROM `contest` WHERE `cid`='$cid'";
	$res = mysql_query($query ,$conexion);
	if($res)
	{
		$contest = mysql_fetch_array($res, MYSQL_BOTH);
		return $contest;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
			mysql_error($conexion) . ", query: '$query'");
	}
}
//funcion para obtener el login
function get_login($team, $conexion)
{
	$query= "SELECT `login` FROM `team` WHERE `login`='$team'";
	$res = mysql_query($query ,$conexion);
	if($res)
	{
		$login = mysql_fetch_array($res, MYSQL_BOTH);		
		return $login;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
			mysql_error($conexion) . ", query: '$query'");
	}
}

/**
*permite subir el codigo fuente solución de problemas que no fueron solucionados durante la postmaraton
*/
function submit_scode($cid, $team, $prob, $langext, $file, $conexion )
{
	if( empty($team)    ) error("No value for Team.");

	global $db;
	//echo $cdata['cid']."**";
	//echo $cid."**";
	
	$login = get_login($team, $conexion);
	if( empty($login['login'])) {
		error("Team '$team' not found in database.");
	}
	$team = $login['login'];

	if( ! is_readable($file) ) {
		error("File '$file' not found (or not readable).");
	}
	if( filesize($file) > SOURCESIZE*1024 ) {
		error("Submission file is larger than ".SOURCESIZE." kB.");
	}

	// Insert submission into the database
	/*$id = $DB->q('RETURNID INSERT INTO solution_sc
				  (cid, teamid, probid, langid, submittime, sourcecode)
				  VALUES (%i, %s, %s, %s, %s, %s)',
				 $cid, $team, $probid, $lang, now(),
				 getFileContents($file, false));
	return $id;i*/
	$date = now();
	$content = addslashes(getFileContents($file, false));
	$in = "INSERT INTO `solution_sc` (`cid`,`teamid`,`probid`,`langid`,`submittime`,`sourcecode`) 
		values('$cid','$team','$prob','$langext','$date','$content')";
	mysql_select_db($db , $conexion);
	$res = mysql_query($in, $conexion);
	if(!$res)
	{	
		throw new RuntimeException("SQL syntax-error, ". "Error " .
			 mysql_error($conexion) . ", query: '$in'");
	}

}


//colsultas para las tablas que trabajan con los datos de las tablas espejo

//obtener un lenguaje especifico
function get_lenguaje($extension, $conexion)
{
	$query= "SELECT `langid`, `name` FROM `language` WHERE `extension`='$extension' AND `allow_submit`='1'";
	$res = mysql_query($query ,$conexion);
	 if($res)
	{
		$lenguaje = mysql_fetch_array($res, MYSQL_BOTH);		
		$nrows = mysql_num_rows($res);
		return $lenguaje;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
			mysql_error($conexion) . ", query: '$query'");
	}
}

//obtener un problema especifico
function get_problem($probid, $cid, $conexion)
{
	$query= "SELECT `probid`, `name` FROM `problem` WHERE `probid`='$probid' AND `cid`='$cid'";
	$res = mysql_query($query ,$conexion);
	 if($res)
	{
		$problem = mysql_fetch_array($res, MYSQL_BOTH);		
		return $problem;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
			mysql_error($conexion) . ", query: '$query'");
	}
	
}

//obtener lenguajes habilitados
function get_languas($conexion)
{
	$query = "SELECT langid, extension, name FROM language WHERE allow_submit = 1 ORDER BY name";
	$res = mysql_query($query ,$conexion);
	if($res)
	{
		$respuesta = array();
		$nrows = mysql_num_rows($res);
		$i = 0;
		while($i<$nrows)
		{
			$datos = mysql_fetch_array($res, MYSQL_BOTH);
			$n_res[$datos['langid']] =$datos['name'];
			$i++;
		}
		$n_res[''] = 'by extension' ;
		return $n_res;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
				mysql_error($conexion) . ", query: '$query'");
	}
	
}
####
//obtener in testcases asociados a un problema
function get_testcasein_past($probid, $conexion)
{	
	//$query = "SELECT OCTET_LENGTH('input') as size_input,`tcpastid`,`rank`,`description`
	//		FROM `testcase_past` WHERE `probid`='$probid' ORDER BY `rank`";
	
	$query = "SELECT OCTET_LENGTH('input') as size_input, `testcaseid`,`rank`,`description`
			FROM `testcase` WHERE `probid`='$probid' ORDER BY `rank`";
	
	$res = mysql_query($query ,$conexion);
	if($res)
	{
		$respuesta = array();
		$nrows = mysql_num_rows($res);
		$respuesta[0] = $nrows;

		for($i=0; $i<$nrows; $i++)
		{
			$datos = mysql_fetch_array($res, MYSQL_BOTH);
			$respuesta[$i+1] = $datos;
		}
		return $respuesta;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
				mysql_error($conexion) . ", query: '$query'");
	}	
}
//obtener out testcases asociados a un problema
function get_testcaseout_past($probid, $conexion)
{	
	$query = "SELECT `output`,`testcaseid`,`rank`,`description`
			FROM `testcase` WHERE `probid`='$probid' ORDER BY `rank`";
	
	$res = mysql_query($query ,$conexion);

	if($res)
	{
		$respuesta = array();
		$nrows = mysql_num_rows($res);
		$respuesta[0] = $nrows;

		for($i=0; $i<$nrows; $i++)
		{
			$datos = mysql_fetch_array($res, MYSQL_BOTH);
			$respuesta[$i+1] = $datos;
		}
		return $respuesta;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
				mysql_error($conexion) . ", query: '$query'");
	}	
}
####
//funcion para consultar el time_init a la hora de subir source code
function time_init($cid,$login,$probid,$conn_db2)
{
	$sql = "SELECT `time_init` FROM `sub_tempo` WHERE `cid`='$cid' AND 
	`teamid`='$login' AND `probid`='$probid '";
	//mysql_select_db("domjudge2",$conn_db2);
	$res = mysql_query($sql, $conn_db2);
	$time_init = mysql_fetch_array($res, MYSQL_BOTH);
	if(!$res)
	{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
			mysql_error($conn_db2) . ", query: '$sql'");
	}
	return $time_init;
}
//function para deletear el campo time_init de la tabla sub_tempo, utilizada para valores temporales
function del_time_init($cid,$login,$probid,$conn_db2)
{
	$del = "DELETE FROM `sub_tempo` WHERE `cid`='$cid' AND 
			`teamid`='$login' AND `probid`='$probid ' ";

	$answ = mysql_query($del, $conn_db2);
	if(!$answ)
	{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
			mysql_error($conn_db2) . ", query: '$del'");
	}
}
//funcion para insertar comentarios
function add_comment($scid, $time, $team, $text, $conexion)
{
		$text = mysql_real_escape_string($text);
		$in = "INSERT INTO `comments` (`scid`,`submittime`,`teamid`,`body`) 
				values('$scid', '$time','$team','$text')";	
		mysql_select_db($db , $conexion);
			$res = mysql_query($in, $conexion);
			if(!$res)
			{
				throw new RuntimeException("SQL syntax-error, ". "Error " .
					 mysql_error($conexion) . ", query: '$in'");
			}
}
//funcion que retorna el codigo fuente de las soluciones existentes para determinado problema
//$key= 0 indica que se busque de acuerdo al id del contest y el id del problema
//$key=1 indica que se busque de acuerdo al id del codigo fuente
// busca de acuerdo al id del contest y el id del problema, pero solo se seleccione scid
function get_source($key, $probid, $cid, $conexion)
{
	if($key == 0)
		$query = "SELECT * FROM solution_sc WHERE cid = '$cid' AND probid = '$probid'";
	elseif($key == 1)
		$query = "SELECT * FROM solution_sc WHERE scid='$cid'";
	elseif($key == 2)
		$query = "SELECT `scid` FROM solution_sc WHERE cid = '$cid' AND probid = '$probid'";
	
	$res = mysql_query($query ,$conexion);
	if($res)
	{
		$respuesta = array();
		$nrows = mysql_num_rows($res);
		$respuesta[0] = $nrows;

		for($i=0; $i<$nrows; $i++)
		{
			$datos = mysql_fetch_array($res, MYSQL_BOTH);
			$respuesta[$i+1] = $datos;
		}
			return $respuesta;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
			mysql_error($conexion) . ", query: '$query'");
	}	
}
//indica si el problema tine o no soluciones, usado para jury
function show_link_sc($probid, $cid, $conexion)
{	
	$num_rows = get_source('0',$probid, $cid, $conexion);
	$link_t = '<a href="list_source_code.php?cid=' . $cid .'&pid='.urlencode($probid).'">';
	
	if($num_rows[0] == 0)
		return " 0 solutions";
	return $link_t.$num_rows[0]." Solutions";
	
}

//verifica si existen comentarios asociados a un sc solution
function num_comments($scid,$conexion)
{
	$query = "SELECT `com_id` FROM comments WHERE `scid` = '$scid'";

	$res = mysql_query($query ,$conexion);

	if($res)
	{
		$nrows = mysql_num_rows($res);
		return $nrows;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
			mysql_error($conexion) . ", query: '$query'");
	}
}

//muestra el total de comentarios existentes de acuerdo al problema
function total_comments($probid, $cid,$conexion)
{
	$link = '<a href="list_source_code.php?cid=' . $cid .'&pid='.urlencode($probid).'" 
	title="total comments for: '.$probid.'">';

	$n_sc = get_source('2',$probid, $cid, $conexion);

	if($n_sc[0] == 0)
	{
		return " 0 comments";	
	}else{
		$n_comm = 0;

		for($i=0; $i<$n_sc[0]; $i++)
		{
			$n_comm = $n_comm + num_comments( $n_sc[$i+1][0],$conexion);
		}
		return $link.$n_comm." comments";
	}
}

//muestra el total de comentarios de acuerdo al scid
function team_comments($probid, $sc, $time,$conexion,$key)
{
	$link = '<a href="source_code.php?id='.$sc.'&time='.urlencode($time).'#comm"
		title="go to comments to: '.$probid.'"  >';	

	$n_comm = num_comments( $sc,$conexion);

	if( $key == '0' )
	{
		return $link.$n_comm." comments";
	}elseif( $key == '1'){
		return $n_comm." comments";
	}	
}

//function para verificar si el team logeado actualmente ha subido solucines, luego de haber finalizado el contest(post)
function check_sc($sc_solutions, $team_log, $cont)
{
	$count =0;
	for($i=1; $i<=$sc_solutions[0]; $i++)
	{
		//$time_sol = difftime($sc_solutions[$i]['submittime'], $cont['endtime']);
		//if( ($sc_solutions[$i]['teamid'] == $team_log) AND ($time_sol > 0 ) )
		if( $sc_solutions[$i]['teamid'] == $team_log )
			$count = $count + 1;
	}
	return $count;
}
//funcion que muestra sc correspondientes a un problem, y la opcion de subir sc solution
//permitir subir soluciones a quines no lograron solucionar problemas durante la postmaraton
//verificar si el algun sc corresponde al team logeado
//$sc_solutions todas las soluciones de un probid
//SIEMPRE Y CUANDO NO EXISTA UN SC DEL TEAM LOGEADO
//$team_cat, $team_log, categoria y login del actual team
function showLinkSc_team($probid, $cid, $team_cat, $team_log, $conexion)
{
	$link_t = '<a href="list_source_code.php?cid=' . $cid .'&pid='.urlencode($probid).'">';
	$link_f = '<a href="websubmit_post.php?cid=' . $cid .'&pid='.urlencode($probid).'">';
	$num_rows = get_source('0',$probid, $cid, $conexion);
	if($num_rows[0] == 0){
		if( $team_cat == "4" ){
			return $link_f."NOT SOLUTION AVAIBLE YET. Add source";//oport subir sc a post team
		}else{
			return "NOT SOLUTION AVAIBLE YET";
		}
	}else{
		if( (check_sc($num_rows, $team_log, $cid) == 0) AND $team_cat == "4" )
		{
			return $link_t.$num_rows[0]." Solutions avaible ".$link_f."Add source";
		}else{
			return $link_t.$num_rows[0]." Solutions avaible";
		}
	}
}
//consultas para tablas espejo
function insert_db2($conexion, $datos, $nid, $t)
{
	global $db;
	if( $t == "contest" )
	{	//hacer backup solo si se trata de contest intern o postmaraton
		if( $datos['inner'] == '1' OR $datos['post'] == '1' )
		{
		$in = "INSERT INTO `contest` (`cid`, `contestname`, `activatetime` , `starttime`, `freezetime`,
		`endtime`, `unfreezetime`, `enabled`, `post`, `inner`) values('$nid', '".$datos['contestname']."',
		 '".$datos['activatetime']."','".$datos['starttime']."', '".$datos['freezetime']."', 
		'".$datos['endtime']."','".$datos['unfreezetime']."', '".$datos['enabled']."', '".$datos['post']."',
		 '".$datos['inner']."')";	
		mysql_select_db($db , $conexion);
			$res = mysql_query($in, $conexion);
			if(!$res)
			{
				throw new RuntimeException("SQL syntax-error, ". "Error " .
					 mysql_error($conexion) . ", query: '$in'");
			}
		}
	}
	if( $t == "team" )
	{	//se guardan solo los usuarios post o participants con affiliation=UTP
		if( ($datos['categoryid'] == '4' AND  $datos['affilid'] == 'UTP') OR 
			($datos['categoryid'] == '1' AND  $datos['affilid'] == 'UTP'))
		{
			$in = "INSERT INTO team (login, name, categoryid, affilid, authtoken, members, 
			room, comments, teampage_first_visited, hostname, enable ) values('".$datos['login']."', 
			'".$datos['name']."', '".$datos['categoryid']."', '".$datos['affilid']."', 
			'".$datos['authtoken']."', '".$datos['members']."', '".$datos['room']."', 
			'".$datos['comments']."', '', '', '".$datos['enable']."')";	
			mysql_select_db($db , $conexion);
			$res = mysql_query($in, $conexion);
			if(!$res)
			{
				throw new RuntimeException("SQL syntax-error, ". "Error " .
					 mysql_error($conexion) . ", query: '$in'");
			}	
		}
	}
	if( $t == "problem" )
	{	//verificar que el problema esta asociado a un inner contest, si es asi
		//el contest se encuentra registrado en esta db2
		$datos_cont = exist("cid", $datos['cid'],"contest",$conexion );

		if($datos_cont[0] > 0 )	//si existe el inner_contest, verificar q no ha finalizado
		{
			if( difftime( now(),$datos_cont[1]['endtime']) < 0 )
			{
				
		$in = "INSERT INTO `problem` ( `probid`, `cid`, `name` , `allow_submit`, `allow_judge`, `timelimit`, 
		`special_run`, `special_compare`, `color`) values('".$datos['probid']."', '".$datos['cid']."',
		 '".$datos['name']."', '".$datos['allow_submit']."', '".$datos['allow_judge']."',
		 '".$datos['timelimit']."', '".$datos['special_run']."', '".$datos['special_compare']."',
		 '".$datos['color']."')";	
				mysql_select_db($db , $conexion);
				$res = mysql_query($in, $conexion);
				if(!$res)
				{
					throw new RuntimeException("SQL syntax-error, ". "Error " .
						 mysql_error($conexion) . ", query: '$in'");
				}
			}
		}
	}
	if($t == "testcase")
	{	//solo se inserta si el problema asociado al contest, pertenece a un contest que no ha pasado
		$connect_db1 = setup_database_connection_db1('jury');
		$cid = problem_contest($datos, $connect_db1);
		$inner = is_inner_contest($cid, $connect_db1);
		if($inner)  //copio los datos de db1
		{
			$query = "SELECT * FROM `testcase` WHERE `testcaseid` ='".$nid."' ";
			$res = mysql_query($query ,$connect_db1);	
			$testcase = mysql_fetch_array($res, MYSQL_BOTH);
			disconect_db1($connect_db1);
			if($res)
			{
		//inserto los datos en db2 si el contest no ha finalizado
		$contest = get_cont($cid, $conexion);
		if(difftime(now(),$contest['endtime']) < 0){
		$in = "INSERT INTO `testcase` (`testcaseid`,`md5sum_input`,`md5sum_output`,`input`,`output`,`probid`,
		`rank`,`description`) values('".$testcase['testcaseid']."','".$testcase['md5sum_input']."',
		'".$testcase['md5sum_output']."','".$testcase['input']."','".$testcase['output']."',
		'".$testcase['probid']."','".$testcase['rank']."','".$testcase['description']."')";
		mysql_select_db($db, $conexion);
		$r = mysql_query($in, $conexion);
			if(!$r)
			{
				throw new RuntimeException("SQL syntax-error, ". "Error " .
					mysql_error($conexion) . ", query: '$in'");
			}
			}
			
			}else{
				throw new RuntimeException("SQL syntax-error, ". "Error " .
					mysql_error($conexion) . ", query: '$query'");
			}
		}
	}
	if( $t == "language" )
	{
		$in = "INSERT INTO `language` (`name`, `extension`, `allow_submit`, `allow_judge`,`time_factor`)
	 	values('".$datos['name']."','".$datos['extension']."','".$datos['allow_submit']."',
			'".$datos['allow_judge']."','".$datos['time_factor']."')";
		mysql_select_db($db, $conexion);
		$r = mysql_query($in, $conexion);
		if(!$r)
		{
			throw new RuntimeException("SQL syntax-error, ". "Error " .
				mysql_error($conexion) . ", query: '$in'");
		}
	}
}
//funcion para actualizar el unfreeze time del actual contest
function unfreeze($time, $cid, $conexion)
{
	global $db;
	$sql = "UPDATE contest  SET `unfreezetime`='$time' WHERE `cid`='$cid'";
	mysql_select_db($db, $conexion);
	$res = mysql_query($sql, $conexion);
	if(!$res)	
	{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
			mysql_error($conexion) . ", query: '$sql'");	
	}
		
}
function update_db2($conexion, $datos, $prikey, $t)
{
	global $db;
	if( $t == "contest" )
	{
		if( $datos['inner'] == '1' OR $datos['post'] == '1' )
		{
		//solo se permite editar si el contest no ha iniciado !!!!! :p
		//	if( difftime(now(), $datos['activatetime']) < 0 )
			if( difftime(now(), $datos['endtime']) < 0  ) 
			{
	$sql = "UPDATE contest  SET contestname='".$datos['contestname']."', activatetime='".$datos['activatetime']."',
	starttime='".$datos['starttime']."', freezetime='".$datos['freezetime']."', endtime='".$datos['endtime']."',
	unfreezetime='".$datos['unfreezetime']."', enabled='".$datos['enabled']."'  WHERE cid= '$prikey' ";
				mysql_select_db($db, $conexion);
				$res = mysql_query($sql, $conexion);
				echo " res ".$res;
				if(!$res)
				{
					throw new RuntimeException("SQL syntax-error, ". "Error " .
						mysql_error($conexion) . ", query: '$sql'");
				}
			}
		}
	}
	if( $t == "team" )
	{
		if( ($datos['categoryid'] == '4' AND $datos['affilid'] == 'UTP')  OR 
			($datos['categoryid'] == '1' AND $datos['affilid'] == 'UTP') )
		{
			$in = "UPDATE team  SET name='".$datos['name']."', categoryid='".$datos['categoryid']."',
			authtoken='".$datos['authtoken']."', members='".$datos['members']."', room='".$datos['room']."', 			 comments='".$datos['comments']."' WHERE login='".$prikey."'";
			mysql_select_db($db , $conexion);
			$res = mysql_query($in, $conexion);
			if(!$res)
			{
//VERIFICAR EL CASO CUANDO NO EXISTA EL TEAM Y LA CATG SEA 4, SE TRATA DE UN QUE EXISTIA PA
				throw new RuntimeException("SQL syntax-error, ". "Error " .
					 mysql_error($conexion) . ", query: '$in'");
			}	
		}	
	}
	if( $t == "problem" )
	{	//verificar que el problema este asociado a un inner constest, el prob debe existir en db2
		$problem = exist("probid",$prikey,$t,$conexion);

		if( $problem[0] > 0 )
		{
			$contest = datos_contest_problem($problem[1]['probid'],$conexion );
			
			if( difftime(now(), $contest['endtime']) < 0  )	//si no ha finalizado
			{
				if( difftime(now(), $contest['activetime']) > 0 )	//si ya inicio
				{	//no puede modificar contest al que esta asociado
				$in = "UPDATE  problem  SET name='".$datos['name']."' , 
				allow_submit='".$datos['allow_submit']."', allow_judge='".$datos['allow_submit']."',
				timelimit='".$datos['timelimit']."', special_run='".$datos['special_run']."' ,
				special_compare='".$datos['special_compare']."', color='".$datos['color']."'
				WHERE cid='".$datos['cid']."'";	
					mysql_select_db($db , $conexion);
					$res = mysql_query($in, $conexion);
					if(!$res)
					{
						throw new RuntimeException("SQL syntax-error, ". "Error " .
				 			mysql_error($conexion) . ", query: '$in'");
					}
				}elseif(difftime(now(), $contest['activetime']) < 0){	//si no ha iniciado
					//puede modificar todos los campos					
				$in = "UPDATE  problem  SET cid='".$datos['cid']."', name='".$datos['name']."' , 
				allow_submit='".$datos['allow_submit']."', allow_judge='".$datos['allow_submit']."',
				timelimit='".$datos['timelimit']."', special_run='".$datos['special_run']."' ,
				special_compare='".$datos['special_compare']."', color='".$datos['color']."'
				WHERE probid='".$prikey."'";	
					mysql_select_db($db , $conexion);
					$res = mysql_query($in, $conexion);
					if(!$res)
					{
						throw new RuntimeException("SQL syntax-error, ". "Error " .
				 			mysql_error($conexion) . ", query: '$in'");
					}	
				}	
			}	
		}
	}
	if( $t == "language" )
	{
		$up = "UPDATE  language  SET `name`='".$datos['name']."', `extension`='".$datos['extension']."',
		`allow_submit`='".$datos['allow_submit']."', `allow_judge`='".$datos['allow_judge']."', 
		`time_factor`='".$datos['time_factor']."' WHERE `langid`='$prikey' ";
		mysql_select_db($db , $conexion);
		$res = mysql_query($up, $conexion);
		if(!$res)
		{
			throw new RuntimeException("SQL syntax-error, ". "Error " .
				 mysql_error($conexion) . ", query: '$up'");
		}
	}
}

function delete_db2($t, $k, $conexion)
{	global $db;
	if( $t == "contest" )
	{	//1)verificar que se trata de un inner contest
		//2)verificar que el contest no se ha realizado o no ha iniciado
		//3)verificar que el contest no se encuentre refernciado en ninguna tabla 
		$contest = exist("cid", $k['cid'], $t, $conexion ); //1)
		print_r($contest);
		if($contest[0] > 0 )	
		//if( $datos['inner'] == '1' OR $datos['post'] == '1' )
		{	//2)
			echo $contest[1]['endtime'];
			if(difftime(now(),$contest[1]['endtime']) < 0 OR difftime(now(),$contest[1]['activetime']) < 0)
			{	//3)verificar que no se encuentre referenciado 
				/*$problems = exist("cid", $k['cid'], "problem", $conexion );
				$solution_sc = exist("cid", $k['cid'], "solution_sc", $conexion );
				if($problems[0] == 0 AND $solution_sc[0] == 0)
				{*/	//borrar contest
					$in = "DELETE FROM `contest` WHERE `cid`='".$k['cid']."'";
					mysql_select_db($db, $conexion);
					$del = mysql_query($in, $conexion);
		
					if(!$del)
					{	throw new RuntimeException("SQL syntax-error, ". "Error " .
							mysql_error($conexion) . ", query: '$in'");
					}
					
				//}
			}
		}
	/*	$query = "SELECT * FROM `contest` WHERE `cid` = '".$k['cid']."'";
		$res = mysql_query($query ,$conexion);	
		if($res)
		{	$datos = mysql_fetch_array($res, MYSQL_BOTH);
			$nrows = mysql_num_rows($res);
			if($nrows > 0 )
			{	//verificar que el contest no se ha realizado o no ha iniciado
				if( difftime( now(),$datos['endtime']) < 0  AND 
					difftime( now(),$datos['activatetime']) < 0  )
				{	//borrar problemas asociados al contest
					delete_prob_contest($k['cid'], $conexion);
					//borrar contest
					$in = "DELETE FROM `contest` WHERE `cid`='".$k['cid']."'";
					$del = mysql_query($in, $conexion);
		
					if(!$res)
					{	throw new RuntimeException("SQL syntax-error, ". "Error " .
							mysql_error($conexion) . ", query: '$in'");
					}
					
					
				}
			}		

		}else{
			throw new RuntimeException("SQL syntax-error, ". "Error " .
			mysql_error($conexion) . ", query: '$query'");
		}*/
	}
	if( $t == "problem" )
	{
		//verificar que el problema se encuentra insertado en db2
		$problema = exist("probid", $k['probid'] , "problem" ,$conexion);

		if( $problema[0] > 0 )
		{	
			//buscar datos del contest asociado al problema
			$contest = datos_contest_problem($problema[1]['probid'],$conexion );
			//verificar que el contest no haya iniciado o finalizado
			//if( difftime( now(), $contest['activatetime']) < 0 
			if( difftime( now(), $contest['endtime']) < 0 )
			{		//borrar problema
					$sql = "DELETE FROM `problem` WHERE `probid`='".$k['probid']."'";
					$del = mysql_query($sql, $conexion);
		
					if(!$del)
					{	throw new RuntimeException("SQL syntax-error, ". "Error " .
							mysql_error($conexion) . ", query: '$sql'");
					}		
			}
		}		
	}
	if($t == "testcase")
	{	//verificar que el testcase exista
		$datos_testc= exist("testcaseid", $k['testcaseid'], "testcase", $conexion);
		if( $datos_testc[0] > 0 )	//si el testcase existe
		{	//verificar: contest asociado al problem del testcase no se haya realizado 
			//buscar datos del contest asociado al problema
			$contest = datos_contest_problem($datos_testc[1]['probid'],$conexion);
			//verificar que el contest no se haya realizado 
			if( difftime( now(),$contest['endtime']) < 0 )
			{
				//borrar testcase
				$sql = "DELETE FROM testcase WHERE `testcaseid`='".$k['testcaseid']."'";
				$del = mysql_query($sql, $conexion);
				if(!$del)
				{	throw new RuntimeException("SQL syntax-error, ". "Error " .
						mysql_error($conexion) . ", query: '$sql'");
				}
			}
		}
		
	}
}

//funcion para conocer datos de un determinado problema 
//util para las operaciones asociadas al archivo de un problema
function datos_problem_db2($probid, $conexion)
{
	$query = "SELECT `fid`,`nombre` FROM `set_problems` WHERE `probid` = '".$probid."'";
	$res = mysql_query($query ,$conexion);	
	if($res)
	{
		$datos = mysql_fetch_array($res, MYSQL_BOTH);
		return $datos;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
		mysql_error($conn_db1) . ", query: '$query'");
	}
}

//fun para subir el pdf correspondiente a la db2
function submit_file_db2($probid, $nombre, $contenido, $tipo, $taman, $conexion)
{
	//global $db;
	$connect_db1 = setup_database_connection_db1('jury');
	$cid = problem_contest($probid, $connect_db1);
	$inner = is_inner_contest($cid, $connect_db1);
	//disconect_db1($connect_db1);
	if($inner)
	{
		$contest = get_cont($cid, $connect_db1);
		disconect_db1($connect_db1);

		if( difftime( now(),$contest['endtime']) < 0 )
		{
			$contenido = addslashes($contenido);
			$in = "INSERT INTO `set_problems` (`probid`,`nombre`,`contenido`,`tipo`,`size`) 
				values('$probid','$nombre','$contenido','$tipo','$taman')";
			//mysql_select_db($db, $conexion);
			$res = mysql_query($in, $conexion);
		
			if(!$res)
			{
				throw new RuntimeException("SQL syntax-error, ". "Error " .
					mysql_error($conexion) . ", query: '$in'");
			}
		}
	}
}
//fun para cambiar el archivo del problema, en db2 
function change_file_db2($probid, $nombre, $contenido, $tipo, $taman, $fid, $conexion)
{
	global $db;
	$connect_db1 = setup_database_connection_db1('jury');
	$cid = problem_contest($probid, $connect_db1);
	$inner = is_inner_contest($cid, $connect_db1);
	//disconect_db1($connect_db1);
	if($inner)  //copio los datos a db2
	{
		$contest = get_cont($cid, $connect_db1);
		disconect_db1($connect_db1);
		if( difftime( now(),$contest['endtime']) < 0 )
		{
			$contenido = addslashes($contenido);
			$in = "UPDATE `set_problems` SET `nombre`='$nombre',`contenido`='$contenido',`tipo`='$tipo',
				`size`='$taman' WHERE `fid`='$fid'";
			mysql_select_db($db, $conexion);
			$res = mysql_query($in, $conexion);
		
			if(!$res)
			{
				throw new RuntimeException("SQL syntax-error, ". "Error " .
					mysql_error($conexion) . ", query: '$in'");
			}
		}
	}

}

//fun para borrar el archivo del problema, en db2 
function delete_file_db2($probid, $fid, $conexion)
{	global $db;
	$connect_db1 = setup_database_connection_db1('jury');
	$cid = problem_contest($probid, $connect_db1);
	$inner = is_inner_contest($cid, $connect_db1);
	//disconect_db1($connect_db1);
	if($inner)  //copio los datos a db2
	{
		$contest = get_cont($cid, $connect_db1);
		disconect_db1($connect_db1);

		if( difftime( now(),$contest['endtime']) < 0 )
		{	
			$in = "DELETE FROM `set_problems` WHERE `fid`='$fid'";
			mysql_select_db($db, $conexion);
			$res = mysql_query($in, $conexion);
		
			if(!$res)
			{	
				throw new RuntimeException("SQL syntax-error, ". "Error " .
					mysql_error($conexion) . ", query: '$in'");
			}
		}

	}
}
		
//consultar innercontest y postamaratones
//recibe la conexion y el indicador de si se trata de inner contest o post 
function query_contest($conexion,$cp)
{
	if($cp == 1){		//se trata de postmaratones
		$query = "SELECT * FROM `contest` WHERE `post`='1' AND `inner`='0'  ORDER BY starttime DESC";
	}elseif($cp == 0){	//se trata  de inner contest
		$query = "SELECT * FROM `contest` WHERE `post` ='0' AND `inner` =1  ORDER BY starttime DESC";
	}
	//$query = "SELECT * FROM `contest` WHERE `post` ='".$p."' AND `inner` =1  ORDER BY starttime DESC";
	$res = mysql_query($query, $conexion);
	if($res){
		$resultado = array();
		$nrows = mysql_num_rows($res);
		$resultado[0] = $nrows;
		for($i=0; $i<$nrows; $i++)
		{
			$datos = mysql_fetch_array($res, MYSQL_BOTH);
			$resultado[$i+1] = $datos;
		}	
		return 	$resultado;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
		mysql_error($conexion) . ", query: '$query'");
	}
}
//funcion para seleccionar todos los problemas asociados a un contest y borrarlos
function delete_prob_contest($cid, $conexion)
{	$query = "SELECT `probid` FROM `problem` WHERE `cid` = '".$cid."'";
	$nrows = mysql_num_rows($res);
	$res = mysql_query($query ,$db);	
	if($res)
	{	if($nrows > 0)
		{
			$problemas = mysql_fetch_array($res, MYSQL_BOTH);
			foreach( $problemas as $row )
			{
				$in = "DELETE FROM `problem` WHERE `probid`='".$row['probid']."'";
				$del = mysql_query($in, $conexion);
		
				if(!$del)
				{	throw new RuntimeException("SQL syntax-error, ". "Error " .
					mysql_error($conexion) . ", query: '$in'");
				}
			}
		}
		
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
		mysql_error($conexion) . ", query: '$query'");
	}
}
//funcion para verificar si en db2 existe el id pasado
//retornla la cantidad de rows y todos los datos correspondientes al id
//$key=campo de  la tabla referente al cual se hace la consulta; $id=valor a buscar en db2; 
//$table=tabla en la que se va a buscar; $conexion= conn db2
//
function exist($key, $id, $table, $conexion)
{
	$respuesta = array();
	if($table == "problem")
	{	//restricciones de acceso a la tabla para ciertos uasurios
		$query = "SELECT `probid`,`name`,`cid`,`allow_submit`,`color` 
			FROM `".$table."` WHERE `".$key."`='$id' ";
	}else{
		$query = "SELECT * FROM `".$table."` WHERE `".$key."`='$id' ";
	}
	//mysql_select_db("domjudge2",$conexion);
	$res = mysql_query($query ,$conexion);	
	if($res)
	{
		$nrows = mysql_num_rows($res);
		$respuesta[0] = $nrows;
		for($i=0; $i<$nrows; $i++)
		{
			$datos = mysql_fetch_array($res, MYSQL_BOTH);
			$respuesta[$i+1] = $datos;
		}
		return $respuesta;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
			mysql_error($conexion) . ", query: '$query'");
	}
}
//funcion para conocer datos del contest asociado a un problema 
function datos_contest_problem($probid,$conexion )
{
	$cid = problem_contest($probid, $conexion);
	$query = "SELECT * FROM contest WHERE `cid`='$cid'";
	$res = mysql_query($query ,$conexion);
	if($res)
	{
		$contest = mysql_fetch_array($res, MYSQL_BOTH);
		return $contest;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
		mysql_error($conexion) . ", query: '$query'");
	}
}


//fun para buscar el contest asociado a un testcase
//################################################################################
//QUERIES EXCLUSIVAS PARA DB1
//seleccionar inner contet
//SE USA LA LIBRERIA DE DOMJUDGE, NO ESTA
/*function inner_contest($conn_db1)
{
	$query = "SELECT * FROM `contest` WHERE `post` ='0' AND `inner` ='1'  ORDER BY starttime DESC";
	$res = mysql_query($query ,$conn$conn_db1if($res)
	{
		$resultado =  result_query($res);
		return 	$resultado;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
		mysql_error($conexion) . ", query: '$query'");
	}
}*/
//en db1 se buscan datos actuales x ejemplo problemas asociados al actual contest, etc

//funcion para buscar los problemas asociados al actual contest
function problems_current_contest($cid, $conexion)
{
	
}




//function para determinar si un contest es interno, es decir, si es tipo inner o tipo post
function is_inner_contest($cid, $condb1)
{
//se hace para evitar estar conectando y desc cuando se llaman varias funci eje: insert_testcases_db2
	if( empty($condb1) )
	{
		$conn_db1 = setup_database_connection_db1('jury');
		$disconnect = true;
	}else{
		$conn_db1 = $condb1;
		$disconnect = false;
	}

	$query = "SELECT `inner`,`post` FROM `contest` WHERE `cid` = '".$cid."'";
	$res = mysql_query($query ,$conn_db1);	
	if($res)
	{
		if($disconnect)
			disconect_db1($conn_db1);

		$resultado = mysql_fetch_array($res, MYSQL_BOTH);
		if($resultado['inner'] == '1' OR $resultado['post'] == '1')
			return true;
		else
			return false;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
		mysql_error($conn_db1) . ", query: '$query'");
	}
}

//funcion para conocer datos de un determinado problema //util para las operaciones asociadas al archivo de un problema
function datos_problem($probid, $condb1)
{	
	if( empty($condb1) )
		$conn_db1 = setup_database_connection_db1('jury');
	else
		$conn_db1 = $condb1;
	
	$query = "SELECT `fid`,`nombre` FROM `set_problems` WHERE `probid` = '".$probid."'";
	$res = mysql_query($query ,$conn_db1);	
	if($res)
	{
		if($disconnect)
			disconect_db1($conn_db1);

		$datos = mysql_fetch_array($res, MYSQL_BOTH);
		return $datos;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
		mysql_error($conn_db1) . ", query: '$query'");
	}
}

//################################################################################
//FUNCIONES COMUNES PARA  DB1 Y DB2
function exist_file($proid ,$conn_db)
{
	$query = "SELECT `fid` FROM `set_problems` WHERE `probid` = '".$proid."'";
	$res = mysql_query($query ,$conn_db);
	if($res)
	{
		$nrows = mysql_num_rows($res);
		return $nrows;
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
			mysql_error($conn_db) . ", query: '$query'");
	}
}
//funcion para mostrar icono pdf cuando existe el archivo
function show_pdf($proid ,$conn_db1, $conn_db2, $cid)
{
	$inner = is_inner_contest($cid, $conn_db1);
	if($inner)
	{
		$conexion = $conn_db2;
		$db="2";
	}else{
		$conexion = $conn_db1;
		$db = "1";
	}

	$nrows = exist_file($proid ,$conexion);
	
	if($nrows>0)
	{
		return '<a href="see_Problem.php?pid='.$proid.'&b='.$db.'">
		<img src="../images/pdf.png" title="Problem archive Upload" ></a>';	
	}
}
//function para mostrar el pdf asociado al problema, busca los pdf en db2, usado para los historicos
function show_pdf_db2($proid, $conexion)
{
	$db = "2";
	$nrows = exist_file($proid ,$conexion);
	
	if($nrows>0)
	{
		return '<a href="see_Problem.php?pid='.$proid.'&b='.$db.'">
		<img src="../images/pdf.png" title="Problem archive Upload" ></a>';	
	}
}

//funcion para conocer el contest al que está asociado un problema
function problem_contest($probid, $condb)
{	
	$query = "SELECT `cid` FROM `problem` WHERE `probid` = '".$probid."'";
	$res = mysql_query($query ,$condb);	
	if($res)
	{
		$contest = mysql_fetch_array($res, MYSQL_BOTH);
		return $contest['cid'];
	}else{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
		mysql_error($condb) . ", query: '$query'");
	}
}
/** COMUNES PARA EL JURY**/
//funcion para generar un login pseudoaleatorio
function generarLogin( $nameteam ){
mt_srand (time());
	$numero_aleatorio = mt_rand(0,1000); 
	$sub = substr($nameteam, 0, 3);
	$log=$sub.$numero_aleatorio;
	return $log;
}
//EXCLUSIVAS PARA DB1
function enable_team($login, $conexion, $ena)
{
	if($ena == '1')
		$var= '1';
	else
		$var = '0';
		
	$sql = "UPDATE team  SET `enable`= '$var' WHERE `login`='$login'";
	//mysql_select_db($db, $conexion);
	$res = mysql_query($sql, $conexion);
	if(!$res)	
	{
		throw new RuntimeException("SQL syntax-error, ". "Error " .
			mysql_error($conexion) . ", query: '$sql'");	
	}
}
?>
